Инструкция по созданию серверного приложения на nodejs + koa + mongodb

Koa

Koa - микрофреймфорк, разработанный командой разработчиков фреймворка Express, и призванный использовать самые последние стандарты языка JavaScript.
Koa “предлагает” активно использовать синтаксис async/await, который позволяет избавиться от ужасно нечитаемого callback hell и является более хорошей альтернативой Promise. Углубляться в синтаксис здесь не будем, это не тема статьи.
Сам Koa, являясь микрофреймворком, из коробки содержит только middleware систему, в нем даже нет маршрутизации. Все это можно получить, подключив необходимую функциональность в middleware chain.

Требования

Koa требует версию Node не меньше 7.6.0.
Использовать более старые версии можно, если подключить Babel, но тогда немного теряется посыл самого Koa (см. выше).
Версия MongoDB нас не интересует, поставим самую последнюю.

Подготовка среды

Про Node.js

Если Node не установлен, то вам необходимо сюда. Если же у вас еще и Linux или macOS, можно установить через менеджер пакетов - здесь сказано, как.
Чтобы проверить, что с Node все в порядке, можно набрать команду:

1
$ node --version

Она выведет текущую версию Node.

Также и про NPM:

1
$ npm --version

Установка зависимостей

Создайте директорию проекта, где будет храниться весь код. Откройте терминал и перейдите в данную директорию.

Инициализируем среду пакета:

1
$ npm init

NPM задаст несколько вопросов. Отвечаем хотя бы на имя пакета и имя автора.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$ npm init

This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (ex) exampleapp
version: (1.0.0)
description: Example application on Koa and PostgreSQL
entry point: (index.js)
test command:
git repository:
keywords:
author: Nariman Safiulin <woofilee@gmail.com>
license: (ISC)
About to write to <..>\package.json:

{
"name": "exampleapp",
"version": "1.0.0",
"description": "Example application on Koa and PostgreSQL",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Nariman Safiulin <woofilee@gmail.com>",
"license": "ISC"
}


Is this ok? (yes)

У нас должен был появиться файл package.json.

Поставим koa:

1
$ npm i koa

Также поставим что-то для роутинга запросов. Будем использовать koa-router, как самый популярный и полнофункциональный вариант.
И заодно koa-logger, чтобы видеть наши запросы к серверу в терминале.

1
$ npm i koa-router koa-logger

Для общения с базой можно использовать пакет koa-mongo.

1
$ npm i koa-mongo

MongoDB

Про Mongo

MongoDB — документоориентированная система управления базами данных (СУБД) с открытым исходным кодом. MongoDB реализует новый подход к построению баз данных, где нет таблиц, схем, запросов SQL, внешних ключей и многих других вещей, которые присущи объектно-реляционным базам данных.

Установка

Скачать установщик MongoDB можно отсюда. Предоставляются Community и Enterprise версии.
После установки надо создать на жестком диске каталог, в котором будут находиться базы данных MongoDB. В ОС Windows по умолчанию MongoDB хранит базы данных по пути C:\data\db, поэтому, если вы используете Windows, вам надо создать соответствующий каталог. В ОС Linux и MacOS каталогом по умолчанию будет /data/db.
Если же возникла необходимость использовать какой-то другой путь к файлам, то его можно передать при запуске MongoDB во флаге –dbpath.

Запуск сервера MongoDB

После создания каталога для хранения БД можно запустить сервер MongoDB. Сервер представляет приложение mongod, которое находится в папке bin. Для этого запустим командную строку (в Windows) или консоль в Linux и там введем соответствующие команды. Для ОС Windows это будет выглядеть так (предполагается, что MongoDB уствновился в C:\mongodb):

1
2
cd c:\mongodb\bin
mongod

Командная строка отобразит нам ряд служебной информации, например, что сервер запускается на localhost на порту 27017.
Если у вас используется расположение баз данных, отличающееся от настроек по умолчанию, то при запуске можно задать каталог для баз данных следующим образом:

1
C:\mongodb\bin\mongod.exe --dbpath d:\test\mongodb\data

В данном случае предполагается, что базы данных у нас будут находиться в каталоге d:\test\mongodb\data.
И после удачного запуска сервера мы сможем производить операции с бд через оболочку mongo. Эта оболочка представляет файл mongo.exe, который располагается в выше рассмотренной папке установки. Запустим этот файл:

1
2
cd c:\mongodb\bin
mongo

Если все установилось верно, и сервер запустился, терминал будет ожидать ввода запросов для взаимодействия с БД.
По умолчанию, MongoDB не использует какие-либо способы авторизации для доступа к базе данных. Сами разработчики MongoDB объясняют это тем, что всю логику должно содержать в себе приложение, а база должна делать то, для чего она лучше всего и предназначена — хранение и управление данными. Поэтому в этой статье соединение с авторизацией рассмотрено не будет.
База данных будет автоматически создана при первом обращении к ней (на запись).
Выйти можно, набрав exit.

Hello, World!

Создадим файл app.js, и заполним его немного измененным стандартным примером Koa. Из кода все достаточно понятно.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
'use strict'
const Koa = require('koa');
const Router = require('koa-router');
const Logger = require('koa-logger');

const app = new Koa();
const router = new Router();

// Отвечаем миру на GET запросы
router.get('/', async (ctx) => {
ctx.body = 'Hello, World!\n';
});

// Отвечаем на имя на GET запросы. :name здесь - это часть URL, и является аргументом
router.get('/:name', async (ctx) => {
ctx.body = `Hello, ${ctx.params.name}!\n`;
});

// Логгер
app.use(Logger());
// Добавим все роуты. Второй middleware отвечает на OPTIONS запросы.
app.use(router.routes()).use(router.allowedMethods());

// Слушаем порт, запускаем сервер
app.listen(3000, () => {
console.log('Server running on port 3000');
});

Теперь можно запустить сервер:

1
$ node app.js

Если сервер успешно запустился, то можно зайти в браузер, и в адресной строке перейти по адресу http://localhost:3000/. Мы должны увидеть приветствие. Также, если к адресу добавить имя, т.е. н-р http://localhost:3000/Elisey, мы должны увидеть свое имя в ответе.
В терминале мы должны увидеть примерно такую картину:

1
2
3
4
5
6
node app.js
Server running on port 3000
<-- GET /
--> GET / 200 19ms 14b
<-- GET /Elisey
--> GET /Elisey 200 3ms 15b

Теперь свяжемся с базой.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
'use strict';
//Для этого добавим соответствующий модуль
const Mongo = require('koa-mongo');
// Используем Mongo
app.use(Mongo());

//Для пустых GET-запросов
router.get('/', async (ctx) => {
//С помощью метода find ищем необходимый документ в коллекции first_collection
const result = await ctx.mongo.db('test').collection('first_collection').find({ text: "Hello, world!" }).toArray();
//Если его нет, добавляем с помощью метода insert
if (result.length === 0)
ctx.mongo.db('test').collection('first_collection').insert({ text: "Hello, world!" });
var helloWorld = await ctx.mongo.db('test').collection('first_collection').find({ text: "Hello, world!" }).toArray();
ctx.body = helloWorld[0].text;
});

// Также поступим и с "именными" GET-запросами
router.get('/:name', async (ctx) => {
const result = await ctx.mongo.db('test').collection('first_collection').find({ text: ctx.params.name }).toArray();
if (result.length === 0)
ctx.mongo.db('test').collection('first_collection').insert({ text: ctx.params.name });
var name = await ctx.mongo.db('test').collection('first_collection').find({ text: ctx.params.name }).toArray();
name = name[0].text;
ctx.body = `Hello, ${name}!\n`;
});

Можно перезапустить сервер и увидеть результат.